
package com.tocea.formation.library;


import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Collection;
import java.util.Iterator;
import java.util.Set;

import org.omg.CORBA._IDLTypeStub;

import com.insta.achilog.dal.BookRequest;
import com.tocea.formation.exceptions.NotEnoughtExemplaireException;

public final class LibraryImpl implements ILibrary
{
    
    private Set<IExemplaire> books;
    private BookRequest BookR =  new BookRequest();
    
   public LibraryImpl()
   {
	   BookRequest BookR =  new BookRequest();
	   	ResultSet result = BookR.getAllBook();
	   	try {
				while (result.next()){
					 IBook book =  new BookImpl(result.getString("liv_titre"), result.getString("liv_auteur"), result.getInt("liv_id"));
					 IExemplaire exemplaire = new Exemplaire(book); 
					 books.add(exemplaire);
				} 
			}
	   	catch (SQLException e) {
				e.printStackTrace();
		}
   }
    
    
    public Set<IExemplaire> getAllExamplaires() {
        return books;
    }
    
    public void addExemplaire(IBook _book) {
    
    	BookR.addBook(_book.getAuthor(), _book.getAuthor());       
    }
    
    public void addExemplaires(IBook _book, int nbExemplaire) {
    
        IExemplaire exemplaire = getExemplaire(_book);
        if (exemplaire == null) {
        	BookR.addBooks(_book.getAuthor(), _book.getAuthor(), nbExemplaire);       
        	exemplaire = Libraryfactory.INSTANCE.createExemplaire(_book);
        	books.add(exemplaire);
        }
        exemplaire.addExemplaire(nbExemplaire);   
    }
    
    public void removeBook(IBook _book) {
    
        boolean find = false;
        for (Iterator<IExemplaire> iterator = books.iterator(); !find && iterator.hasNext();) {
            IExemplaire exemplaire = iterator.next();
            find = exemplaire.getBook().equals(_book);
            if (find) {
                books.remove(exemplaire);
                BookR.removeBook(_book.getAuthor(), _book.getName());
            }            
        }
    }
    
    public IExemplaire getExemplaire(IBook _book) {
    
        boolean find = false;
        IExemplaire res = null;
        for (Iterator<IExemplaire> iterator = books.iterator(); !find && iterator.hasNext();) {
            IExemplaire exemplaire = iterator.next();
            find = exemplaire.getBook().equals(_book);
            if (find) {
                res = exemplaire;
            }
            
        }
        return res;
    }
    
    public boolean existBook(IBook _book) {
    
        boolean find = false;
        for (Iterator<IExemplaire> iterator = books.iterator(); !find && iterator.hasNext();) {
            IExemplaire exemplaire = iterator.next();
            find = exemplaire.getBook().equals(_book);
        }
        return false;
    }
    
    public void removeExemplaires(IBook _book, int nbExemplaire) throws NotEnoughtExemplaireException {
    
        IExemplaire exemplaire = getExemplaire(_book);
        if (exemplaire == null)
            throw new NotEnoughtExemplaireException("aucun exemplaire disponible pour le livre " + _book.getName());
        else {
            exemplaire.removeExemplaire(nbExemplaire);
            
            
        }
        
    }
    
}
